/*
 * Copyright 2025 The JA-SIG Collaborative. All rights reserved.
 * distributed with this file and available online at
 */
package com.lap.auth.application.dict;

import com.lap.auth.application.dict.assembler.DictAssembler;
import com.lap.auth.application.dict.command.BatchCreateDictCmd;
import com.lap.auth.application.dict.dto.DictDto;
import com.lap.auth.domain.dict.Dict;
import com.lap.auth.domain.dict.repository.DictRepository;
import com.lap.context.starter.entity.LocalInfo;
import com.lap.context.starter.handler.LangHandler;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 数据字典应用服务层
 *
 * <ol>
 *   <li>不做业务规则，只做技术规则（加密/解密是技术实现，业务不关注）
 *   <li>取数，赋值，对象转换在这层执行
 *   <li>命名有规范，动词+领域名字
 *   <li>如查询比较多，建议分开领域QueryAppService,如:分页查询，分页查询返回关联字段
 * </ol>
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class DictAppService {

  private final DictAssembler dictAssembler;
  private final DictRepository dictRepository;

  @Transactional(rollbackFor = Exception.class)
  public void batchCreateDict(BatchCreateDictCmd cmd) {
    List<Dict> list = dictAssembler.toDomains(cmd);
    dictRepository.deleteByDictTypeCode(cmd.getDictTypeCode());
    dictRepository.saveAll(list);
  }

  public List<DictDto> getDictList(String dictTypeCode) {
    List<Dict> sources = dictRepository.findByDictTypeCode(dictTypeCode);
    return dictAssembler.toDtoList(sources);
  }

  public Map<String, List<DictDto>> queryDictList(List<String> dictTypeCodes) {
    LocalInfo info = LangHandler.get();
    log.info("localInfo:{}", info);
    List<Dict> sources = dictRepository.findByDictTypeCode(dictTypeCodes, info.storeLang());
    List<DictDto> list = dictAssembler.toDtoList(sources);
    return list.stream()
        .collect(
            Collectors.groupingBy(
                DictDto::getDictTypeCode,
                Collectors.collectingAndThen(
                    Collectors.toList(),
                    dto ->
                        dto.stream()
                            .sorted(Comparator.comparingInt(DictDto::getSortOrder))
                            .toList())));
  }
}
